C++学习(一八四)clang是什么,与LLVM关系 | 您所在的位置:网站首页 › 轻量级编译器 意义 › C++学习(一八四)clang是什么,与LLVM关系 |
Clang是一个C语言、C++、Objective-C、OpenCL、CUDA、RenderScript语言的轻量级编译器。源代码发布于BSD协议下。 Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器。 Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。 LLVM项目的一个子项目,基于LLVM架构的C/C++/Objective-C编译器前端。 gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 编译器。gcc 是 GNU 亲儿子,Ubuntu 等常用发行版标配。clang 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在已经是 Mac(XCode) 的默认编译器,微软等大公司都在往上靠,前景一片光明。 相比于GCC,Clang具有如下优点 编译速度快:在某些平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GGC快3倍) 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右 模块化设计:Clang采用基于库的模块化设计,易于 IDE 集成及其他用途的重用 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告 设计清晰简单,容易理解,易于扩展增强 Clang与LLVM关系 LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生成)。 源代码(c/c++)经过clang--> 中间代码(经过一系列的优化,优化用的是Pass) --> 机器码 clang: C语言编译器,类似于gcc clang++: C++编译器,类似于g++。clang++只是clang的一个别名。 clang-format:按照固定的规范格式化C/C++代码,非常智能。文档请见:http://clang.llvm.org/docs/ClangFormat.html clang-modernize:把按照C++98标准写的代码,转成C++11标准的。文档请见:http://clang.llvm.org/extra/ModernizerUsage.html llvm-as:LLVM 汇编器 llvm-dis: LLVM 反汇编器 opt:LLVM 优化器 llc:LLVM 静态编译器 lli:LLVM的字节码执行器(某些平台下支持JIT) llvm-link:LLVM的字节码链接器 llvm-ar:LLVM的静态库打包器,类似unix的ar。 llvm-nm:类似于unix的nm llvm-ranlib:为 llvm-ar 打包的文件创建索引 llvm-prof:将 ‘llvmprof.out’ raw 数据格式化成人类可读的报告 llvm-ld :带有可装载的运行时优化支持的通用目标连接器 llvm-config:打印出配置时 LLVM 编译选项、库、等等 llvmc:一个通用的可定制的编译器驱动 llvm-diff:比较两个模块的结构 bugpoint:自动案例测试减速器 llvm-extract:从 LLVM 字节代码文件中解压出一个函数 llvm-bcanalyzer:字节代码分析器 (分析二进制编码本身,而不是它代表的程序) FileCheck:灵活的文件验证器,广泛的被测试工具利用 tblgen:目标描述阅读器和生成器 lit:LLVM 集成测试器,用于运行测试 基于这个认知,我们可以认为 LLVM 包括了两个概念:一个广义的 LLVM 和一个狭义的 LLVM 。广义的 LLVM 指的是一个完整的 LLVM 编译器框架系统,包括了前端、优化器、后端、众多的库函数以及很多的模块;而狭义的 LLVM 则是聚焦于编译器后端功能的一系列模块和库,包括代码优化、代码生成、JIT 等。 下面大概讲一讲 LLVM 和 Clang 的关系。我们将它们对应于传统的编译器当中的几个独立的部分,这样能够更加方便明确的表述出它们之前的关系。 Clang LLVM 对应到这个图中,可以非常明确的找出它们的关系。整体的编译器架构就是 LLVM 架构;Clang 大致可以对应到编译器的前端,主要处理一些和具体机器无关的针对语言的分析操作;编译器的优化器和后端部分就是之前提到的 LLVM 后端,即狭义的 LLVM。 |
CopyRight 2018-2019 实验室设备网 版权所有 |